module Mtop();
   
   booth2 u_1( 
			   .i_a(8'hab),
			   // .i_a(8'h3b),
   			   .i_b(8'h56),
   			   .i_sign(1'b1) );

   // reg [7:0] a, b;
   // reg 		 sign;
   
   // booth2 u_1( .i_a(a),
   // 	       .i_b(b),
   // 	       .i_sign(sign) );

   // initial begin
   // 	  a = 8'hab;
   // 	  b = 8'h56;

   // 	  // #10 a = 8'hcd;
   // 	  // b = 8'h78;

   // 	  // #10 a = 8'hcd;
   // 	  // b = 8'h77;
   // end
   
   
endmodule // Mtop


  
module booth2(
	      input [7:0] i_a,
	      input [7:0] i_b, // multiplier
	      input 	  i_sign
	      );

   // wire [7+1:0] 	  a = {i_sign ? i_a[7] : 1'b0, i_a};
   wire [31:0] 	  a = {i_sign ? {24{i_a[7]}} : 24'b0, i_a};
   wire [7+2:0] 	  b = {{2{i_sign ? i_b[7] : 1'b0}}, i_b};
   
   
   wire [7+2+1:0] 	  b_ext = {b[9:0], 1'b0};


   
   int 				  booth_array[4:0];
   integer 			  pp[4:0];
   integer 			  result;
   
   
   always_comb
	 begin
		$display("a = %x, b = %x", a, b);
		
		// booth recoding 
		for(int i=0;i<=8;i+=2)
		  begin
			 booth_array[i/2] = b_ext[i] + b_ext[i+1] - 2*b_ext[i+2]; // how the value extended ??
			 // $display("time = %t, i = %d", $time, i);
		  end

		for(int i=0;i<=4;i++)
   		  $display("booth_arry[%d] = %d", i, booth_array[i]);

		//partitical product
		for(int i=0;i<=4;i+=1)
		  begin
			 pp[i] = (booth_array[i]*a) << (2*i);
			 $display("a = %x, pp[%d] = %x", a, i, pp[i]);
		  end
		
		// the result
		result = 0;
		for(int i=0;i<=4;i+=1)
		  result += pp[i];
		
		$display("result : %x", result);
		$display("result : %d", result);
		
	 end


   
   
   
  // initial begin
  // 	 #20
  //      for(int i=0;i<=4;i++)
  //  		 $display("booth_arry[%d] = %d", i, booth_array[i]);
  // end

endmodule // booth2

      

